package com.by.car.redis;

import com.alibaba.fastjson.JSON;
import com.by.car.entity.ShopCartItem;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;

import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Component;

import java.util.ArrayList;
import java.util.List;
import java.util.Map;


@Component
@Slf4j
public class RedisCartUtil {

    @Autowired
    private RedisTemplate redisTemplate;

    // Redis键前缀
    private static final String CART_PREFIX = "cart:";

    //向Redis添加购物车项
    public void addCartItem(ShopCartItem item) {
        String key=CART_PREFIX+item.getUserId();
        // key:用户ID    属性名:sku    值:对象的 JSON 字符串
        redisTemplate.opsForHash().put(key, Integer.valueOf(item.getSkuId()).toString(), JSON.toJSONString(item));

    }

    //根据userId从Redis查询数据
    public List<ShopCartItem> selectCarItem(int userId){
        String key=CART_PREFIX+userId;
        List<ShopCartItem> list=new ArrayList<>();
        //从Redis哈希(Hash)结构中获取指定键的所有字段和值，并以Map形式返回
        Map<Object,Object> map=redisTemplate.opsForHash().entries(key);
        //获取所有
        for (Object value:map.values()) {
            //获取值转换为Java对象列表
            list.add(JSON.parseObject(value.toString(),ShopCartItem.class));
        }
        return list;
    }

    //根据id,sku从Redis删除购物商品
    public void deleteCartItem(int userId,int skuId){
        String key=CART_PREFIX+userId;
        redisTemplate.opsForHash().delete(key, Integer.valueOf(skuId).toString());
        //若购物车为空，则删除键
        if (redisTemplate.opsForHash().size(key)==0){
            redisTemplate.delete(key);
        }
    }


    //查询购物车中sku种类
    public Long carSkuNum(int userId){
        String key = CART_PREFIX + userId; // 复用你的 key 生成规则：cart:userId
        // 获取 Hash 中 field 的数量（即 SKU 种类数）
        Long skuCount = redisTemplate.opsForHash().size(key);
        return skuCount;
    }


    //查询单条商品详情，(用于：增添、选中状态)
    public ShopCartItem selectOnly(int userId,int skuId){
        // 1. 构建Redis中的Hash键（用户维度）
        String key = CART_PREFIX + userId;
        // 2. 构建Hash中的field（SKU ID）
        String field = Integer.valueOf(skuId).toString();
        // 3. 从Hash中获取指定field的值
        Object cartItemJson = redisTemplate.opsForHash().get(key, field);
        // 4. 将Json字符串转换为 对象
        if (cartItemJson == null) {
            return null; // 商品不存在，直接返回null
        }
        try {
            return JSON.parseObject(cartItemJson.toString(), ShopCartItem.class); // 只有非null时才调用toString()
        } catch (Exception e) {
            log.error("解析购物车商品JSON失败", e);
            return null;
        }
    }
}
